#ifndef LUCNX_TASK_H
#define LUCNX_TASK_H

#include <Lucnx/types.h>
#include <Lucnx/global.h>
#include <Lucnx/memory.h>
#include <Lucnx/list.h>

typedef enum task_state
{
    TASK_RUNNING,
    TASK_BLOCKED,
    TASK_READY,
    TASK_WAITING
}task_state;

typedef struct task_frame_t
{
    u32 ebp;
    u32 ebx;
    u32 edi;
    u32 esi;

    void *eip;
}task_frame_t;

typedef struct task_t
{
    u32 kstack; // 内核栈

    char name[16];
    task_state state;
    list_node task_node;

    pid_t pid;
    pid_t ppid;

    u8 prio;
    u8 counter;
    u32 jiffies;

    int mode; // 任务模式
    int exit_state; // 退出状态

    block_desc_t desc_dir[8];
    u32 *page_dir;

    u32 magic; // 魔数, 检测栈溢出
    u32 brk;

    bitmap_t vmap; // fork 的时候需要
}_packed task_t;

void schedule();

task_t *running_task();

task_t *task_create(void *target, char *name, u8 prio);

void task_to_user_mode(void *target);
void task_activate(task_t *task);

void task_block(task_t *task, task_state state);
void task_unblock(task_t *task);

pid_t sys_fork();
void sys_exit();

void task_sleep(u32 ms);
void task_yield();

pid_t pid_alloc();
pid_t sys_getpid();
pid_t sys_getppid();

void ps();

void task_init();

#endif